import { http } from "@/utils/http";

/** 统一响应格式 */
export interface ApiResponse<T = any> {
  /** 状态码 */
  code: number;
  /** 响应消息 */
  message: string;
  /** 响应数据 */
  data?: T;
  /** 时间戳 */
  timestamp?: number;
}

/** 分页响应格式 */
export interface PageResponse<T> {
  /** 记录列表 */
  records: T[];
  /** 总记录数 */
  total: number;
  /** 每页大小 */
  size: number;
  /** 当前页码 */
  current: number;
  /** 总页数 */
  pages: number;
}

/** 通知类型 */
export enum NotificationType {
  /** 新增粉丝 */
  FOLLOW = "FOLLOW",
  /** 点赞(统一类型,通过targetType区分文章/评论) */
  LIKE = "LIKE",
  /** 收藏 */
  COLLECT = "COLLECT",
  /** 评论 */
  COMMENT = "COMMENT",
  /** 回复 */
  REPLY = "REPLY",
  /** @提及 */
  MENTION = "MENTION",
  /** 系统通知 */
  SYSTEM = "SYSTEM"
}

/** 目标类型 */
export enum TargetType {
  /** 文章 */
  ARTICLE = "article",
  /** 评论 */
  COMMENT = "comment",
  /** 用户 */
  USER = "user"
}

/** 用户信息 */
export interface UserInfo {
  /** 用户ID */
  userId: number;
  /** 用户名 */
  userName?: string;
  /** 昵称 */
  nickName: string;
  /** 头像 */
  avatar: string;
  /** 最新操作时间 (只在通知senders中使用，升级后新增) */
  latestTime?: string;
}

/** 通知发送者信息(兼容旧代码) */
export type NotificationSender = UserInfo;

/** 通知目标信息 */
export interface NotificationTarget {
  /** 目标ID */
  id: number;
  /** 目标类型 */
  type: string;
  /** 目标标题 */
  title: string;
  /** 目标摘要 */
  summary: string;
  /** 目标URL */
  url: string;
}

/** 评论详情 */
export interface CommentDetail {
  /** 评论ID */
  id: number;
  /** 评论内容 */
  content: string;
  /** 创建时间 */
  createTime: string;
  /** 点赞数 */
  likeCount: number;
  /** 回复数 */
  replyCount: number;
  /** 当前用户是否已点赞 */
  isLiked: boolean;
  /** 评论者信息 */
  commenter: UserInfo;
  /** 回复的用户信息 */
  replyToUser?: UserInfo;
}

/** 原评论引用 */
export interface CommentQuote {
  /** 原评论ID */
  id: number;
  /** 原评论内容 */
  content: string;
  /** 创建时间 */
  createTime: string;
  /** 原评论者信息 */
  commenter: UserInfo;
}

/** 文章信息 */
export interface ArticleInfo {
  /** 文章ID */
  id: number;
  /** 文章标题 */
  title: string;
  /** 文章摘要 */
  summary: string;
  /** 封面图片URL */
  coverImage: string;
  /** 文章链接 */
  url: string;
}

/** 点赞文章额外数据（兼容旧代码） */
export interface LikeArticleExtra {
  /** 文章标题 */
  articleTitle: string;
  /** 文章摘要 */
  articleSummary: string;
}

/** 点赞评论额外数据（兼容旧代码） */
export interface LikeCommentExtra {
  /** 评论ID */
  commentId: number;
  /** 评论内容 */
  commentContent: string;
  /** 文章ID */
  articleId: number;
  /** 文章标题 */
  articleTitle: string;
}

/** 评论文章额外数据（兼容旧代码） */
export interface CommentExtra {
  /** 评论ID */
  commentId: number;
  /** 评论内容 */
  commentContent: string;
  /** 文章ID */
  articleId: number;
  /** 文章标题 */
  articleTitle: string;
  /** 文章摘要 */
  articleSummary?: string;
}

/** 回复评论额外数据（兼容旧代码） */
export interface ReplyExtra {
  /** 回复评论ID */
  replyCommentId: number;
  /** 回复内容 */
  replyContent: string;
  /** 原评论ID */
  originalCommentId: number;
  /** 原评论内容 */
  originalCommentContent: string;
  /** 文章ID */
  articleId: number;
  /** 文章标题 */
  articleTitle: string;
  /** 文章摘要 */
  articleSummary?: string;
}

/** 通知详情(根据接口文档) */
export interface NotificationDetail {
  /** 通知ID */
  id: number;
  /** 发送者信息 */
  sender: UserInfo;
  /** 通知类型 */
  type: string;
  /** 通知类型名称 */
  typeName: string;
  /** 操作描述 */
  actionText: string;
  /** 通知标题 */
  title: string;
  /** 通知内容 */
  content: string;
  /** 目标类型 */
  targetType: string;
  /** 目标ID */
  targetId: number;
  /** 目标信息 */
  target?: NotificationTarget;
  /** 评论详情(评论/回复类型) */
  commentDetail?: CommentDetail;
  /** 原评论引用(回复类型) */
  originalComment?: CommentQuote;
  /** 文章信息(评论/回复类型) */
  articleInfo?: ArticleInfo;
  /** @提及的用户列表 */
  mentionedUsers?: UserInfo[];
  /** 额外数据(JSON格式) */
  extraData?: string;
  /** 是否已读 0-未读 1-已读 */
  isRead: number;
  /** 阅读时间 */
  readTime?: string;
  /** 创建时间 */
  createTime: string;

  // ========== 点赞通知聚合字段 ==========
  /** 点赞人数(聚合点赞通知) */
  senderCount?: number;
  /** 点赞者ID列表(JSON数组字符串,聚合点赞通知) */
  senderIds?: string;
  /** 最新点赞者ID(聚合点赞通知) */
  lastSenderId?: number;
  /** 最后更新时间(聚合点赞通知) */
  lastUpdateTime?: string;
  /** 点赞者列表(前3个,聚合点赞通知) */
  senders?: UserInfo[];
}

/** 通知统计信息(根据接口文档) */
export interface NotificationStats {
  /** 用户ID */
  userId?: number;
  /** 未读关注通知数 */
  unreadFollowCount: number;
  /** 未读点赞通知数 */
  unreadLikeCount: number;
  /** 未读收藏通知数 */
  unreadCollectCount: number;
  /** 未读评论通知数 */
  unreadCommentCount: number;
  /** 未读回复通知数 */
  unreadReplyCount: number;
  /** 未读系统通知数 */
  unreadSystemCount: number;
  /** 未读公告数 */
  unreadAnnouncementCount: number;
  /** 总未读通知数(包含公告) */
  totalUnreadCount: number;
  /** 是否有未读通知 */
  hasUnread: boolean;

  // 兼容旧字段
  /** 点赞未读数 */
  likeUnreadCount?: number;
  /** 评论未读数 */
  commentUnreadCount?: number;
  /** 关注未读数 */
  followUnreadCount?: number;
}

/** 未读数量统计（简化版，用于WebSocket推送） */
export interface UnreadCount {
  /** 总未读数 */
  total: number;
  /** 关注未读数 */
  follow: number;
  /** 点赞未读数（文章+评论） */
  like: number;
  /** 评论未读数 */
  comment: number;
  /** 回复未读数 */
  reply: number;
  /** @提及未读数 */
  mention: number;
  /** 系统通知未读数 */
  system: number;
}

/** 通知列表查询参数(根据接口文档) */
export interface NotificationListQuery {
  /** 页码,默认1 */
  pageNum?: number;
  /** 每页数量,默认10 */
  pageSize?: number;
  /** 通知类型: FOLLOW/LIKE/COLLECT/COMMENT/REPLY/MENTION/SYSTEM */
  type?: string;
  /** 已读状态: null-全部, 0-未读, 1-已读 */
  isRead?: number;
  /** 发送者用户ID */
  senderId?: number;
  /** 目标类型: article/comment/user */
  targetType?: string;
  /** 目标ID */
  targetId?: number;
  /** 是否只查询未读 */
  onlyUnread?: boolean;
  /** 开始时间 */
  startTime?: string;
  /** 结束时间 */
  endTime?: string;
}

// ==================== API 接口 ====================

/**
 * 分页查询通知列表
 * @param params 查询参数
 */
export const getNotificationListApi = (params?: NotificationListQuery) => {
  return http.request<ApiResponse<PageResponse<NotificationDetail>>>(
    "get",
    "/api/notifications/list",
    { params }
  );
};

/**
 * 获取通知详情
 * @param notificationId 通知ID
 */
export const getNotificationDetailApi = (notificationId: number) => {
  return http.request<ApiResponse<NotificationDetail>>(
    "get",
    `/api/notifications/${notificationId}`
  );
};

/**
 * 获取通知统计
 */
export const getNotificationStatsApi = () => {
  return http.request<ApiResponse<NotificationStats>>(
    "get",
    "/api/notifications/stats"
  );
};

/**
 * 获取最新通知列表
 * @param limit 限制数量，默认10，最大50
 */
export const getLatestNotificationsApi = (limit?: number) => {
  return http.request<ApiResponse<NotificationDetail[]>>(
    "get",
    "/api/notifications/latest",
    { params: { limit } }
  );
};

/**
 * 标记通知为已读
 * @param notificationId 通知ID
 */
export const markNotificationAsReadApi = (notificationId: number) => {
  return http.request<ApiResponse>(
    "put",
    `/api/notifications/${notificationId}/read`
  );
};

/**
 * 批量标记通知为已读
 * @param notificationIds 通知ID列表
 */
export const batchMarkNotificationsAsReadApi = (notificationIds: number[]) => {
  return http.request<ApiResponse>("put", "/api/notifications/batch-read", {
    data: notificationIds
  });
};

/**
 * 标记所有通知为已读
 * @param type 通知类型，不传则标记所有类型
 */
export const markAllNotificationsAsReadApi = (type?: NotificationType) => {
  return http.request<ApiResponse>("put", "/api/notifications/read-all", {
    params: { type }
  });
};

/**
 * 删除通知
 * @param notificationId 通知ID
 */
export const deleteNotificationApi = (notificationId: number) => {
  return http.request<ApiResponse>(
    "delete",
    `/api/notifications/${notificationId}`
  );
};

/**
 * 批量删除通知
 * @param notificationIds 通知ID列表
 */
export const batchDeleteNotificationsApi = (notificationIds: number[]) => {
  return http.request<ApiResponse>("delete", "/api/notifications/batch", {
    data: notificationIds
  });
};

/**
 * 清空已读通知
 */
export const clearReadNotificationsApi = () => {
  return http.request<ApiResponse>("delete", "/api/notifications/clear-read");
};

/**
 * 重新计算通知统计
 */
export const recalculateNotificationStatsApi = () => {
  return http.request<ApiResponse>(
    "post",
    "/api/notifications/recalculate-stats"
  );
};

// ==================== 聚合通知接口 ====================

/** 聚合通知分组信息 */
export interface GroupedNotification {
  /** 分组键 */
  groupKey: string;
  /** 通知类型 */
  type: string;
  /** 通知类型名称 */
  typeName: string;
  /** 目标类型 */
  targetType: string;
  /** 目标ID */
  targetId: number;
  /** 该组通知总数 */
  count: number;
  /** 未读数量 */
  unreadCount: number;
  /** 是否全部已读 */
  allRead: boolean;
  /** 聚合标题 */
  aggregatedTitle: string;
  /** 目标信息 */
  target?: NotificationTarget;
  /** 发送者列表(前几个) */
  senders: UserInfo[];
  /** 其他发送者数量 */
  otherSendersCount: number;
  /** 最新时间 */
  latestTime: string;
}

/** 聚合通知查询参数 */
export interface GroupedNotificationQuery {
  /** 当前页码，默认1 */
  current?: number;
  /** 每页数量，默认20 */
  size?: number;
  /** 通知类型筛选 (LIKE/COMMENT/FOLLOW/SYSTEM) */
  type?: string;
  /** 已读状态 (0=未读, 1=已读) */
  isRead?: 0 | 1;
}

/**
 * 获取聚合通知列表（推荐使用）
 * @param params 查询参数
 */
export const getGroupedNotifications = (params?: GroupedNotificationQuery) => {
  return http.request<ApiResponse<PageResponse<GroupedNotification>>>(
    "get",
    "/api/notifications/grouped",
    { params }
  );
};

/**
 * 获取分组通知的详细列表
 * @param params 查询参数
 */
export const getGroupDetails = (params: {
  type: string;
  targetType: string;
  targetId: number;
}) => {
  return http.request<ApiResponse<NotificationDetail[]>>(
    "get",
    "/api/notifications/grouped/details",
    { params }
  );
};

/**
 * 标记分组通知为已读
 * @param data 分组数据
 */
export const markGroupAsRead = (data: {
  type: string;
  targetType: string;
  targetId: number;
}) => {
  return http.request<ApiResponse>("put", "/api/notifications/grouped/read", {
    data
  });
};
